package com.habu.oss.springboot.starter;

import lombok.SneakyThrows;
import software.amazon.awssdk.services.s3.model.Bucket;
import software.amazon.awssdk.services.s3.model.BucketCannedACL;
import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.S3Object;

import java.io.InputStream;
import java.time.Duration;
import java.util.List;

/**
 * @Author 公众号：码猿技术专栏
 * @Description oss操作模板
 * @ClassName OssTemplate
 * @Date 2023/3/18 18:15
 **/
public interface OssTemplate {

    /**
     * 判断bucket是否存在
     * @param bucket
     * @return
     */
    @SneakyThrows
    boolean bucketExist(String bucket);

    /**
     * 创建bucket
     * @param bucket bucket名称
     */
    void createBucket(String bucket, BucketCannedACL acl);

    /**
     * 获取所有的bucket
     * @return
     */
    List<Bucket> getAllBuckets();

    /**
     * 通过bucket名称删除bucket
     * @param bucket
     */
    void removeBucket(String bucket);

    /**
     * 上传文件
     * @param bucket bucket名称
     * @param objectName 文件名称
     * @param stream 文件流
     * @param contextType 文件类型
     * @throws Exception
     */
    void putObject(String bucket, String objectName, InputStream stream, String contextType) throws Exception;

    /**
     * 上传文件
     * @param bucket bucket名称
     * @param objectName 文件名称
     * @param stream 文件流
     * @throws Exception
     */
    void putObject(String bucket, String objectName, InputStream stream) throws Exception;

    /**
     * 获取文件
     *
     * @param bucket bucket名称
     * @param objectName 文件名称
     * @return S3Object
     */
    GetObjectResponse getObject(String bucket, String objectName);

    /**
     * 获取对象的限时url
     * @param bucket
     * @param objectName
     * @param duration
     * @return
     */
    String getExpiresObjectURL(String bucket, String objectName, Duration duration);

    /**
     * 获取对象的签名url
     * @param bucket
     * @param objectName
     * @return
     */
    String getPublicObjectURL(String bucket, String objectName);

    /**
     * 通过bucket和objectName删除对象
     * @param bucket
     * @param objectName
     * @throws Exception
     */
    void removeObject(String bucket, String objectName) throws Exception;

    /**
     * 根据文件前置查询文件
     *
     * @param bucket bucket名称
     * @param prefix     前缀
     * @param recursive  是否递归查询
     * @return S3ObjectSummary 列表
     */
    List<S3Object> getAllObjectsByPrefix(String bucket, String prefix, boolean recursive);
}
